package com.yesun.dcm.rpc.proxy;

import com.yesun.dcm.rpc.Invoker;
import com.yesun.dcm.rpc.RpcRequest;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class InvokerInvocationHandler implements InvocationHandler {

    //被代理者
    private final Invoker<?> invoker;
    public InvokerInvocationHandler(Invoker<?> invoker) {
        this.invoker = invoker;
    }

    /**
     * @param proxy 代理对象
     * @param method 执行的方法
     * @param args 执行的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String methodName = method.getName();
        Class<?>[] parameterTypes = method.getParameterTypes();
        RpcRequest request = new RpcRequest();
        request.setInterfaceName(invoker.getInterface().getName());
        request.setMethodName(methodName);
        request.setParameterTypes(parameterTypes);
        request.setRequestId(System.currentTimeMillis() + "");
        request.setParameters(args);
        //调用
        return invoker.invoke(request).getResult();
    }

}
